package com.lxw.question;

import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;

public class Q15 {

    /**
     * 题目描述
     * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
     * 例如，字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值，
     * 但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。
     * 链接：https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof
     */

    /**
     * 未通过leetcode的答案。
     * @param s
     * @return
     */
    public static boolean isNumber(String s) {
        s = s.trim();
        if(s.length() == 0 || s == null){
            return false;
        }
        if(s.trim().length() == 0){
            return false;
        }
        Map<Character,Integer> map = new TreeMap<>();
        //若有字母
        int charNum = 0;
        int nums = 0;
        ArrayList<Integer> indexs = new ArrayList<>();
        for(int i = 0 ; i < s.length() ; i++){
            if((s.charAt(i) >= 'A' && s.charAt(i) <='Z') || (s.charAt(i) >= 'a' && s.charAt(i) <= 'z')){
                charNum++;
            }
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9')
                nums++;
            if(s.charAt(i) == '-'){
                indexs.add(i);
            } else if(s.charAt(i) == '+'){
                indexs.add(i);
            }
            if(!map.containsKey(s.charAt(i))){
                map.put(s.charAt(i),1);
            } else {
                map.put(s.charAt(i),map.get(s.charAt(i)) + 1);
            }
        }
        if(nums == 0){
            return false;
        }
        if(charNum > 1){
            return false;
        }

        //空格
       if(map.containsKey(' ')){
            return false;
        }

        //点的问题
        if(map.containsKey('.') && map.get('.') > 1){
            return false;
        }

        //其他字母的问题
        if(charNum != 0 && ((!map.containsKey('e')) && (!map.containsKey('E')))){
            return false;
        }

        //e的问题
        if((map.containsKey('e') && map.get('e') > 1) || (map.containsKey('e') && map.get('e') > 1)){
            return false;
        }

        //位置
        //点的位置
        if(map.containsKey('.')){
            int index = s.lastIndexOf('.');
            if(index+1 == s.length()){

            }else if(s.charAt(index + 1) == 'e' || s.charAt(index + 1) == 'E'){

            } else if(((s.charAt(index + 1) < '0' || s.charAt(index + 1) > '9') || (s.charAt(index + 1) == ' '))){
                return false;
            } else if(index  ==  s.length() && index == 0){
                return false;
            }

            if(index == 0){

            } else if(s.charAt(index - 1) < '0' || s.charAt(index - 1) > '9'){
                return false;
            }
        }

        //e的位置的问题
        if(map.containsKey('e') || map.containsKey('E')){
            int index = map.containsKey('e') ? s.lastIndexOf('e') : s.lastIndexOf('E');
            int indexIn = index + 1;
            int indexDe = index - 1;
            if(indexIn == s.length()){
                return false;
            }
            if(indexDe < 0){
                return false;
            }
            // TODO
            String str = s.substring(index + 1);
            if(str.indexOf('.') > 0){
                return false;
            }
            if(s.charAt(indexIn) == ' ' || s.charAt(indexDe) == ' '){
                return false;
            }
        }

        //符号的问题
        //符号总位数超标时
        if(indexs.size() > 2){
            return false;
        }
        //若有两个符号
        if(indexs.size() == 2){
            //有两个符号
            int index1 = indexs.get(0);
            int index2 = indexs.get(1);
            if(index1 != 0 && s.charAt(index1 - 1) != ' '){
                return false;
            }
            if(s.charAt(index1+1) == ' '){
                return false;
            }
            if(s.charAt(index1+1) < '0' || s.charAt(index1+1) > '9'){
                return false;
            }

            int index2De = index2 - 1;
            int index2In = index2 + 1;

            if(s.charAt(index2De) != 'e' && s.charAt(index2De) != 'E' || s.charAt(index2De) == ' '){
                return false;
            }
            if(s.charAt(index2In) < '0' || s.charAt(index2In) > '9' || s.charAt(index2In) == ' '){
                return false;
            }
        }

        //若有一个符号
        if(indexs.size() == 1){
            int index = indexs.get(0);
            if(index != 0){
                return true;
            }
            //否则的话这个符号一定在e的后面
            int indexDe = index - 1;
            int indexIn = index + 1;
            if(s.charAt(indexDe) != 'e' && s.charAt(indexDe) != 'E'){
                return false;
            }
            if(s.charAt(indexIn) < '0' || s.charAt(indexIn) > '9'){
                return false;
            }
        }

        if(s.charAt(0) == '.'){
            if(s.charAt(1) < '0' || s.charAt(1) > '9'){
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args){
        boolean result = isNumber(" -123e-12");
        System.out.println(result);
    }
}
